package com.muyan.singleton.v5;

/**
 * @Author: YLTDMenglc
 * @Date: 2019/6/11
 * @Time: 13:43
 * @Description: 双重校验锁
 * 懒汉模式的优化版，拥有线程安全、高效率以及延迟加载等特性。
 * 但是这种方式需要jdk1.5以上，且在一些平台和编译器下有错。
 */
public class Sinleton5 {

    private static volatile Sinleton5 sinleton;

    private Sinleton5() throws Exception {
        if (sinleton != null) {
            throw new Exception("对象已经被初始化..");
        }
        System.out.println("Sinleton5被初始化...");
    }

    public static Sinleton5 getSinleton() {
        // 当多个线程 同时在可能new 对象的时候 才会加锁，保证线程问题。
        if (sinleton == null) {
            synchronized (Sinleton5.class) {
                if (sinleton == null) {// 当前线程已经获取到锁的呢，在判断一下该对象是否已经初始化过，没有初始化过的 创建
                    try {
                        sinleton = new Sinleton5();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return sinleton;
    }
}
